跳到主要内容

Data Access 数据访问类型节点之三 JSON、XML、Web 与 MongoDB

上一节我们讲了 KNIME 中 Data Access 数据访问类型节点中的一大类 -- Database 数据库节点集合,并给出了对应于各节点的学习建议。这节我们讲 Data Access 数据访问类型节点中 JSON、XML 等节点集合。

Data Access 数据访问类型节点(继续...)

JSON、XML类型

JSON、XML是两种数据格式,在网络数据交换中,这两种数据格式的使用相对频繁,我们先看这两种数据格式是如何表示的。

JSON 格式介绍与解析

维基百科中是这么描述 JSON 的:JSON(JavaScript Object Notation,JavaScript对象表示法)是一种由道格拉斯·克罗克福特构想和设计、轻量级的数据交换语言,该语言以易于让人阅读的文字为基础,用来传输由属性值或者序列性的值组成的数据对象。

尽管 JSON 是 JavaScript 的一个子集,但其实它是一种独立于语言的文本格式,只不过因为它脱胎与 JavaScript,所以 JSON 这个名字就这么延续称呼起来了。这里不去介绍具体 JSON 的组成、形式等,而举一个 JSON 例子,目的是让我们了解 JSON 就是大概如此模样,如何才能交给我们其他的 KNIME 节点进行下一步的处理。如下是一段具体的 JSON 数据:

{
"book": [
{
"year": 1999,
"title": "Timeline",
"author": "Michael Crichton"
},
{
"year": 2000,
"title": "Plain Truth",
"author": "Jodi Picoult"
}
]
}

不用了解 JSON 的具体规则,我们也大致清楚上面在说什么。有两本书,我们录有它们的年份、书名以及作者,每一个 {...} 中对应了一条信息,如果套用曾经我们用过的 CSV 文件,那么以上的数据可能要表示成类似下面这样才能继续分析:

year,title,author
1999,"Timeline","Michael Crichton"
2000,"Plain Truth","Jodi Picoult"

那么,怎么样把 JSON 格式中的各个字段对应到 CSV 类似字段呢?我们需要做的就是告诉 KNIME,去 JSON 的什么位置取什么数据,然后把它们组合在一起就可以了。

而具体的 去什么位置 就是靠指定 具体数据所在的位置 来实现的。

在 KNIME 中,对于 JSON 和 XML 都有相应的 Reader 节点(在 Node Repository 的 Structured Data 目录下),我们需要做的主要是配置 具体数据所在的位置。下图就是 JSON Reader 节点的配置界面以及输出结果:

JSON Reader 配置界面 JSON Reader 配置界面

JSON Reader 的输出结果 JSON Reader 的输出结果

注意到上图方框中所标记的内容,{JSON} 字样指的是这一列的数据存储的是 JSON 这种对象,而小写的 json 字样,代表了这一列的列名。这里对照回忆一下我们曾经在基础操作中讲过的班级信息的例子:

CSV Reader 的输出结果 CSV Reader 的输出结果

我们在班级信息中处理的是整数和字符串类型的数据,比如在 列名前面,有一个 I 的标识,就代表了这一列存储的是整型(Integer),而其他标识为 S 的,就代表那一列存储的是字符串(String)。数据在 KNIME 中存储的类型非常重要,可喜的是,KNIME 将这些信息以非常便于观察的方式展现,给我们下一步处理数据提供了很多线索。当我们猜不到某些标识的含义时,可以通过 Spec 标签页去了解具体的列是什么类型的数据。

当我们通过 JSON Reader 把相应的 JSON 数据读取成 JSON 类型的数据后,我们需要把这种类型的数据转换为我们熟悉的整型、字符型、日期型以及浮点型等等才方便进行下一步的处理。在这里 JSON Path 这个节点就能够帮我们把 对应的字段先从 JSON 类型中提取出来。

JSON Path 的配置页面 JSON Path 的配置页面

打开 JSON Path 的配置页面,初看有点不知从何处下手,但其实非常好用,尤其是下面的 JSON-Cell Preview。如果我们想把 JSON 数据中的日期字段给摘出来,那么就直接点击 1999,然后点击 Add Collection query (增加集合查询)就可以了!现在我们可以点击刚刚生成的规则,看看下面 Preview 部分,是不是把你想要的结果都给标记出来了。在下图中,我们看到那两个被自动标记的蓝色日期就是我们想要提取的内容。

在 JSON Path 中提取了year 在 JSON Path 中提取了year

在上面的配置中,我们只用了 Add Collection Query 这一个功能,就会自动生成对应的 Column name、JSON Path 等信息, 可以简单理解为它会帮我们提取很多在 1999 这个位置类似的数据;如果我们不是想要所有的日期,而只是想提取 1999 这一个年份,那么我们可以用 Add Single Query (增加单独查询)这个功能;如果我们想要自己手动写 JSON Path 也是很容易的,看看前面自动生成的 JSON Path -- $['book'][*]['year'],想要写一个类似的路径规则不会太难,如果想要更详细的说明,请参照 JSON Path 节点自带的帮助文件。另外其中有意思的一点是,如果使用的是 Collection Query(集合查询),对应的 Column name 是一个复数单词。比如 year 会被提取为 years、title 会被提取为 titles 等等。 我们配置完其他部分,运行并获得输出如下:

JSON Path 的输出结果 JSON Path 的输出结果

对于 Collection 集合类型的 query,获得的结果一定是一个列表,这也就是图中图示 [...] 的含义。我们需要把这个列表拆开,一一对应起来。比如 1999,TimeLine,Michael... 这三个数据就应该是一行的。这个时候我们就需要用到 UnGroup 节点了。UnGroup 节点比较简单,主要是用来拆开列表数据的,配置和结果如下:

UnGroup 节点配置 UnGroup 节点配置

UnGroup 节点的结果 UnGroup 节点的结果

可以看到,输出结果和我们期待的基本一致,只需要把对应的 JSON 列去除就可以了。

XML 格式介绍与解析

XML 是一种比 JSON 更为古老、但应用同样广泛的格式,全名为 Extensible Markup Language (可扩展标记语言),它是一种标记语言。如下是一段具体的 XML 数据:

<?xml version="1.0" encoding="UTF-8"?>
<inventory>
<book year="1999">
<title>Harry Potter and the Sorcerer's Stone</title>
<author>J. K. Rowling</author>
</book>
<book year="2000">
<title>Harry Potter and the Chamber of Secrets</title>
<author>J. K. Rowling</author>
</book>
</inventory>

可以看到,其实它和 JSON 数据并没有本质上的不同,只不过是约定了不同的数据存储和展示格式。下面我们配置一个类似于 JSON Path 的节点 -- XPath,获取我们想要的数据, 可以看到除了配置的路径语句格式有所差别, 其他再无任何不同:

XPath 配置 XPath 配置

JSON 与 XML 的相应节点

JSON 和 XML 的 KNIME 节点都是被组织在 Structured Data 节点下的。只要理解了上面的内容,大部分节点的功能基本上看个名字就能猜到什么意思了。

JSON 相关节点 JSON 相关节点

XML 相关节点 XML 相关节点

JSON Path 与 XPath 都是非常非常重要的节点, 需要熟练掌握。

Container Input(JSON)、Container Output(JSON) 这两个节点值得一提,功能相对比较高阶,会在 workflow 调用 workflow 的时候做为数据的接口用到。

而其余的相关节点,就相对没有 JSON Path 和 XPath 那么重要了。

Web 相关

有一些 Web 服务,通过调用它们(比如 Get Request)可以获得一些结果,这些结果如果是 JSON 或 XML 的,那么在后面的节点直接使用 JSON 和 XML 相关的处理节点进行数据的初步提取,继而进行后续的处理。只要我们搞清楚原始数据是怎么调用的就可以了. 比如有没有登陆验证过程,发送 Request 的时候需不需要加一些特定的标识等等问题。

Web 相关节点 Web 相关节点

NoSQL 相关(以 MongoDB 为例)

如果我们搞懂了 JSON,其实我们也顺便搞懂了 NoSQL 数据库中的 MongoDB 是怎么读取的。因为 MongoDB 默认的输出就是 JSON. MongoDB 不属于 KNIME Database 中的节点,现在它属于 KNIME Labs 中的节点,默认我们是需要打开菜单 File -> Install KNIME Extensions, 并在搜索对话框中搜索 KNIME MongoDB Integration,然后才能安装的, 具体使用不再赘述。

搜索安装 MongoDB 相关扩展 搜索安装 MongoDB 相关扩展

MongoDB 相关节点 MongoDB 相关节点